/*
 *  ClientInfo.h
 *  ClientDispatch
 *
 *  Created by Andrey on 13/10/2008.
 *  Copyright 2008 ИУ7-2003. All rights reserved.
 *
 */

/**	\file ClientInfo.h
	\brief В этом файле описана структура данных CDClientInfo, хранящая информацию 
	о клиенте, используемую библиотекой ClientDispatch и реализуемым протоколом.
 */

#pragma once

#include <sys/time.h>
#include <KAnsiCWrappers.h>
#include "../NetTalk/NetTalk.h"
#include "../Smtp/Smtp.h"

/** \enum ProtocolState
	\brief Перечисление возможных состояний, в которых может находиться конечный автомат протокола
 */
enum ProtocolState {
	Idle,
	ConnectionEstablished,
	TransactionStarted,
	DataTransfer
};

/**	\struct CDClientInfo
	\brief Структура данных, хранящая информацию о клиенте, используемую библиотекой
	ClientDispatch и реализуемым протоколом.
 */
BEGIN_STRUCT_DECLARATION(CDClientInfo)
	AsciiStringPtr clientAddress;
	//!< Строка, содержащая IP-адрес клиента
	struct SmtpFSM* protocolFsm;
	//!< Конечный автомат реализуемого протокола
	SmtpCommandHeaderPtr currentCommandHeader;
	//!< Указатель на заголовок последней полученной от клиента команды
	BytePtr clientData;
	//!< Данные, полученные от клиента и хранящиеся на сервере
	DataBuffer recentlyReceived;
	//!< Данные, которые были только что получены от клиента
	DataBuffer dataToSend;
	//!< Данные, которые будут отправлены клиенту библиотекой ClientDispatch
	struct timeval lastInteractionTime;
	//!< Время последнего взаимодействия с данным клиентом (используется для отключения неторопливых)
	TAILQ_ENTRY(_CDClientInfo) clientQueueEntries;
	TAILQ_ENTRY(_CDClientInfo) clientListEntries;
END_STRUCT_DECLARATION(CDClientInfo)
/*
typedef struct {
	UnicodeStringPtr clientAddress;
	int currentState;
	DataBuffer clientData;
	DataBuffer recentlyReceived;
	DataBuffer dataToSend;
	TAILQ_ENTRY(CDClientInfo) clientQueueEntries;
	TAILQ_ENTRY(CDClientInfo) clientListEntries;
} CDClientInfo, *CDClientInfoPtr;
*/